home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0257 / demo.exe / TEXTIO.DEM < prev   
Text File  |  1992-02-22  |  11KB  |  385 lines

  1. ; ----------------------------
  2. ; TEXTIO.DEM   - Demoprogramm für die Routinen aus TEXTIO.LIB
  3. ;                (für den A86)
  4. ;
  5. ;                (c) Bernd Schemmer 1990 - 1992
  6. ;                Letzter Update: 22.02.1992
  7. ;
  8. ; Übersetzen:
  9. ;  A86 TEXTIO.DEM DEMOS.INC TO TEXTIO.COM
  10. ;
  11. ; Hinweis: Die Environment-Variable 'A86' muß den Dateinamen 'MACROS.MAC'
  12. ;          enthalten und die .LIB-Dateien müssen über die Datei A86.LIB
  13. ;          erreichbar sein.
  14. ;
  15. ; ---------------------------
  16.  
  17.          jmp start            ; Daten überspringen
  18.  
  19. logo  db CR,LF
  20.       db 'TEXTIO.DEM  - Demoprogramm für die Routinen aus TEXTIO.LIB'
  21.       db CR,LF
  22.       db '----------------------------------------------------------'
  23.       db CR,LF
  24.       db 'ACHTUNG: Dieses Demo erstellt die Dateien TEST.IN und TEST.OUT'
  25.       db CR,LF
  26.       db '         im aktuellen Directory (bestehende Dateien werden überschrieben!)'
  27.       db CR,LF
  28.       db CR,LF
  29.       db 'Bitte eine Taste drücken (ESC für Programm-Ende) ...'
  30.       db CR,LF
  31. GETLENGTH logo
  32.  
  33. ; ----------------------------
  34. ; Meldungen
  35. ;
  36. MakeMsg CreateMSG1, 'Erstelle die Datei TEST.IN'
  37. MakeMsg CreateMSG2, 'Erstelle die Datei TEST.OUT'
  38. MakeMsg WriteMSG1,  'Schreibe die Datei TEST.IN (500 Zeilen)'
  39. MakeMsg CloseMSG1,  'Schliesse die Datei TEST.IN'
  40. MakeMsg AppendMSG1, 'Verlängere die Datei TEST.IN (500 Zeilen)'
  41. MakeMsg OpenMSG1,   'Öffne die Datei TEST.IN zum Lesen'
  42. MakeMsg KonvertMSG1,'Konvertiere die Datei TEST.IN und schreibe die Datei TEST.OUT'
  43. MakeMsg CloseMSG2,  'Schliesse die Datei TEST.OUT'
  44.  
  45. ; ----------------------------
  46. ; Fehlermeldungen
  47. ;
  48. MakeMsg MemoryError,  CR,LF, 'Fehler: Zuwenig freier Speicher'
  49. MakeMsg CreateError1, CR,LF, 'Fehler beim Erstellen der Datei TEST.IN'
  50. MakeMsg CreateError2, CR,LF, 'Fehler beim Erstellen der Datei TEST.OUT'
  51. MakeMsg WriteError1,  CR,LF, 'Fehler beim Schreiben der Datei TEST.IN'
  52. MakeMsg WriteError2,  CR,LF, 'Fehler beim Schreiben der Datei TEST.OUT'
  53. MakeMsg ReadError1,   CR,LF, 'Fehler beim Lesen der Datei TEST.IN'
  54. MakeMsg OpenError1,   CR,LF, 'Fehler beim Öffnen der Datei TEST.IN'
  55. MakeMsg AppendError1, CR,LF, 'Fehler bein Verlängern der Datei TEST.IN'
  56. MakeMsg CloseError1,  CR,LF, 'Fehler beim Schliessen der Datei TEST.IN'
  57. MakeMsg CloseError2,  CR,LF, 'Fehler beim Schliessen der Datei TEST.OUT'
  58.  
  59. ; ----------------------------
  60. ; Variablen
  61. ;
  62. DefString zeile,255           ; Zeile zum Lesen u. Schreiben der Datei
  63.  
  64. ; Datei-Tabelle zum Bearbeiten der Datei TEST.IN
  65. ;
  66. InputBufferT dw
  67.             dw ?              ; Handle
  68. InputLen    dw ?              ; Größe des Puffers
  69.             dw ?              ; Zeiger
  70.             dw ?              ; Ende
  71. InputOfs    dw ?              ; Offset des Puffers
  72. InputSeg    dw ?              ; Segment des Puffers
  73. InputStat   db 0FFh           ; Status (0FFh = geschlossen)
  74. InputName   db 7              ; Länge des Namens
  75.             db 'TEST.IN'      ; Name der Datei
  76.             db 41h-7 dup 0
  77.  
  78. ; Datei-Tabelle zum Schreiben einer Datei
  79. ;
  80. OutputBufferT dw
  81.             dw ?              ; Handle
  82. OutputLen   dw ?              ; Größe des Puffers
  83.             dw ?              ; Zeiger
  84.             dw ?              ; Ende
  85. OutputOfs   dw ?              ; Offset des Puffers
  86. OutputSeg   dw ?              ; Segment des Puffers
  87. OutputStat  db 0FFh           ; Status (0FFh = geschlossen)
  88. OutputName  db 8              ; Länge des Namens
  89.             db 'TEST.OUT'     ; Name der Datei
  90.             db 41h-8 dup 0
  91.  
  92. ; ----------------------------
  93.  
  94. start:
  95.          call ShowLogoAndAsk
  96.                            ; Speicher für die Puffer allokieren
  97.          mov bx,2000h
  98.          mov ah,048h
  99.          int 021h
  100.          jnc >l1
  101.                            ; 2 Segmente kriegen wir nicht, nehmen wir was
  102.          mov ah,048h       ; wir kriegen können
  103.          int 021h
  104.          jc >l2
  105.                            ; min. 512 Byte pro Puffer sollten es aber schon
  106.                            ; sein
  107.          cmp bx,(512xD*2)/16xD
  108.          jae >l1
  109. l2:
  110.          WRITE_STRING MemoryError
  111.          mov ax,0FFh
  112.          jmp Ende
  113.  
  114. l1:
  115.                            ; Dateitabelle korrigieren
  116.  
  117.          shr bx,1          ; BX = Größe eines Puffers in Paragraphen
  118.  
  119.          mov InputSeg,ax
  120.          add ax,bx
  121.          mov OutputSeg,ax
  122.  
  123.          shl bx,1
  124.          shl bx,1
  125.          shl bx,1
  126.          shl bx,1
  127.          or bx,bx
  128.          if z mov bx,0FFFFh
  129.                            ; BX = Größe eines Puffers in Byte
  130.  
  131.          mov InputOfs,0
  132.          mov OutputOfs,0
  133.  
  134.          mov InputLen,bx
  135.          mov OutputLen,bx
  136.  
  137.          WRITE_STRING CreateMSG1
  138.  
  139.                            ; Testdatei erstellen
  140.          mov bx,offset InputBufferT
  141.          mov al,1          ; Code = Schreiben
  142.          call CreateFileBuffered
  143.          jnc >l1
  144.                            ; Fehler beim Erstellen
  145.          WRITE_STRING createError1
  146.          jmp Ende
  147. l1:
  148.          WRITE_STRING WriteMSG1
  149.  
  150.                            ; 500 Zeilen in die Datei schreiben
  151.          mov cx,500xD
  152.          mov bx,offset InputBufferT
  153.          mov si,offset zeile
  154. l0:
  155.          push cx
  156.          call ErstelleZeile
  157.          call WriteLnFileBuffered
  158.          pop cx
  159.  
  160.          jc >l1
  161.  
  162.          push dx
  163.          mov dl,'.'        ; 'Laufzeit'-Anzeige
  164.          mov ah,02h
  165.          int 021h
  166.          pop dx
  167.  
  168.          loop l0
  169.  
  170.          jmp >l2
  171.  
  172. l1:
  173.                            ; Fehler beim Schreiben
  174.          WRITE_STRING WriteError1
  175.          jmp CloseFile1    ; Datei trotzdem schliessen!
  176.  
  177. l2:
  178.          call ShowCR_LF
  179.                            ; Datei schliessen
  180.          WRITE_STRING CloseMSG1
  181.  
  182.          call CloseFileBuffered
  183.          jnc >l1
  184.                            ; Fehler beim Schliessen der Datei
  185.          WRITE_STRING CloseError1
  186.          jmp Ende
  187. l1:
  188.                            ; Datei verlängern um 500 Zeilen
  189.          WRITE_STRING AppendMSG1
  190.  
  191.          call AppendFileBuffered
  192.          jnc >l1
  193.                            ; Fehler beim Eröffnen der Datei zum Verlängern
  194.          WRITE_STRING AppendError1
  195.          jmp Ende
  196. l1:
  197.                            ; 500 weitere Zeilen in die Datei schreiben
  198.          WRITE_STRING WriteMSG1
  199.  
  200.          mov cx,500xD
  201.          mov bx,offset InputBufferT
  202.          mov si,offset zeile
  203.  
  204. l0:
  205.          push cx
  206.          call ErstelleZeile
  207.          call WritelnFileBuffered
  208.          pop cx
  209.  
  210.          jc >l1
  211.  
  212.          push dx
  213.          mov dl,'.'        ; 'Laufzeit'-Anzeige
  214.          mov ah,02h
  215.          int 021h
  216.          pop dx
  217.  
  218.          loop l0
  219.          jmp >l2
  220.  
  221. l1:
  222.                            ; Fehler beim Schreiben
  223.          WRITE_STRING WriteError1
  224.          jmp CloseFile1    ; Datei trotzdem schliessen!
  225. l2:
  226.          call ShowCR_LF
  227.                            ; Datei schliessen
  228.          WRITE_STRING CloseMSG1
  229.  
  230.          call CloseFileBuffered
  231.          jnc >l1
  232.                            ; Fehler beim Schliessen der Datei
  233.          WRITE_STRING CloseError1
  234.          jmp Ende
  235. l1:
  236.                            ; Datei öffnen zum Lesen
  237.          WRITE_STRING OpenMSG1
  238.  
  239.          call ResetFileBuffered
  240.          jnc >l1
  241.                            ; Fehler beim Öffnen
  242.          WRITE_STRING OpenError1
  243.          jmp ende
  244. l1:
  245.                            ; zweite Datei erstellen
  246.          WRITE_STRING CreateMSG2
  247.  
  248.          mov bx,offset OutputBufferT
  249.          mov al,1          ; Code = Schreiben
  250.          call CreateFileBuffered
  251.          jnc >l1
  252.                            ; Fehler beim Erstellen der Datei
  253.          WRITE_STRING CreateError2
  254.          jmp CloseFile1    ; Input-Datei schliessen
  255.  
  256. l1:
  257.          WRITE_STRING KonvertMSG1
  258.          mov si,offset Zeile
  259.          mov di,offset Zeile
  260.          mov cx,offset InputBufferT
  261.          mov dx,offset OutputBufferT
  262.  
  263. l00:
  264.          mov bx,cx         ; BX zeigt auf die Tabelle der Datei TEST.IN
  265.          call ReadLnFileBuffered
  266.          jnc >l1
  267.          cmp ah,0FFh       ; EOF ?
  268.          je CloseFile1_2
  269.                            ; Fehler beim Lesen
  270.          WRITE_STRING ReadError1
  271.          jmp CloseFile1_2
  272. l1:
  273.                            ; Zeile bearbeiten
  274.          call KonvertiereZeile
  275.  
  276.          push dx
  277.          mov dl,'.'        ; 'Laufzeit'-Anzeige
  278.          mov ah,02h
  279.          int 021h
  280.          pop dx
  281.  
  282.          mov bx,dx         ; BX zeigt auf die Datei-Tabelle von TEST.OUT
  283.          call WritelnFileBuffered
  284.          jnc >l1
  285. l10:
  286.          WRITE_STRING WriteError2
  287.          jmp CloseFile1_2  ; Input- und Output-Datei schliessen!
  288. l1:
  289.          jmp l00           ; nächste Zeile
  290.  
  291.  
  292. CloseFile1_2:
  293.          call ShowCR_LF
  294.                            ; Output-Datei schliessen
  295.          WRITE_STRING CloseMSG2
  296.  
  297.          mov bx,offset OutputBufferT
  298.          call CLoseFileBuffered
  299.          jnc CloseFile1
  300.                            ; Fehler beim Schliessen
  301.          WRITE_STRING CloseError2
  302.  
  303. CloseFile1:                 ; Input-Datei schliessen
  304.          WRITE_STRING CloseMSG1
  305.  
  306.          mov bx,offset InputBufferT
  307.          call CLoseFileBUffered
  308.          jnc Ende
  309.                            ; Fehler beim Schliessen
  310.          WRITE_STRING CloseError1
  311. ENDE:
  312.          EndProcess
  313.  
  314. ; ----------------------------
  315. ; KonvertiereZeile
  316. ;
  317. ; Funktion: Ersetzt alle Zeichen mit ASCII-Codes kleiner als 32 in
  318. ;           der Zeile durch einen Punkt
  319. ;
  320. KonvertiereZeile:
  321.          push di,si,cx
  322.          mov di,offset Zeile
  323.          lodsb
  324.          or al,al
  325.          jz >l9               ; Zeile ist leer
  326.          mov cl,al
  327.          xor ch,ch            ; CX = Länge der Zeile
  328.          mov di,si
  329. l0:
  330.          lodsb
  331.          cmp al,BLANK
  332.          if b mov al,'.'
  333.          stosb
  334.          loop l0
  335. l9:
  336.          pop cx,si,di
  337.          ret
  338.  
  339. ; ----------------------------
  340. ; ErstelleZeile
  341. ;
  342. ; Funktion: Erstellt eine Zeile mit (fast) zufälligen Werten für die Datei
  343. ;
  344. ErstelleZeile:
  345.          push di,bx,cx,dx
  346.  
  347.          mov di,offset zeile
  348.          xor al,al
  349.          mov [di],al          ; Zeile erst einmal löschen
  350.  
  351.          xor ah,ah            ; 'zufällige' Zeilenlänge ermitteln
  352.          int 01Ah
  353.  
  354.          mov cl,dl
  355.          shl cl,1
  356.          add cl,dl
  357.  
  358.          xor ch,ch
  359.          or cx,cx
  360.          jz >l2
  361.  
  362.          mov [di],cl          ; Stringlänge eintragen
  363.          inc di
  364.  
  365. l0:
  366.          push cx
  367.          xor ah,ah
  368.          int 01Ah
  369.  
  370.          cmp dl,CR            ; KEINE Trennzeichen zulassen!
  371.      if e mov dl,4
  372.          cmp dl,LF
  373.      if e mov dl,4
  374.          cmp dl,CTRL_Z
  375.      if e mov dl,4
  376.  
  377.          mov al,dl
  378.          stosb
  379.          pop cx
  380.          loop l0
  381. l2:
  382.          pop dx,cx,bx,di
  383.          ret
  384.  
  385.